/**
 * 专门处理内存页结构体的 attributes 成员变量，该变量指示页的状态。
 */
#ifndef _AHAMOLETT_PAGE_FLAGS_H_
#define _AHAMOLETT_PAGE_FLAGS_H_

#include <mm/mm_types.h>
#include <mm/flags_opt.h>

/* 内存页结构体各个标志位的定义。 */
enum PAGE_FLAGS {
    PG_VALID,   /// 该位置位时页结构体才是有效的。
    PG_SLAB,    /// 对应的内存页属于SLAB分配器。
    PG_LRU,     /// 对应的页在LRU链表中。
    PG_BUDDY,   /// 对应的内存页处于空闲状态，在伙伴系统的空闲链表中。
    PG_COMPOUND,    /// 对应的页属于一个组合页，其部分属性在首页中。
    PG_COMPOUND_HEAD,   /// 对应页面为一个组合页的首页。
    PG_UPTODATE,    /// 页内的数据已经从块设备中读出，且未出错。
    PG_WRITEBACK,   /// 页内的内容已经回写入块设备中。
    PG_DIRTY,   /// 从块设备中读取的内存已经被修改，可能需要回写。
    PG_LOCKED,  /// 页面锁，置位时代表该页已被锁住。
};

#define DEFINE_PAGE_FLAG_BIT(name, bit) \
    DEFINE_FLAG_BIT(struct page_struct, flags, Page, name, bit)

DEFINE_PAGE_FLAG_BIT(Valid, PG_VALID)
DEFINE_PAGE_FLAG_BIT(Slab, PG_SLAB)
DEFINE_PAGE_FLAG_BIT(LRU, PG_LRU)
DEFINE_PAGE_FLAG_BIT(Buddy, PG_BUDDY)
DEFINE_PAGE_FLAG_BIT(UpToDate, PG_UPTODATE)
DEFINE_PAGE_FLAG_BIT(Dirty, PG_DIRTY)
DEFINE_PAGE_FLAG_BIT(WriteBack, PG_WRITEBACK)
DEFINE_PAGE_FLAG_BIT(Compound, PG_COMPOUND)
DEFINE_PAGE_FLAG_BIT(CompoundHead, PG_COMPOUND_HEAD)
DEFINE_PAGE_FLAG_BIT(Locked, PG_LOCKED)

#endif
